package com.chandon.T03_method_reference;

import com.chandon.common.Cv;
import com.chandon.common.Role;
import com.chandon.T03_method_reference.function.ConstrutorFunction;
import com.chandon.T03_method_reference.function.MethodWithoutArgsReturnFunction;

import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * 静态方法的引用
 * 类名::静态方法
 * 对应lambda表达式: (args)->类名.静态方法(args)
 *
 * 函数式接口的实现(lambda表达式)，恰好可以通过调用一个静态方法来实现，则可以使用静态方法引用
 * 人话：某个静态方法，实现的功能，正好是某个函数式接口的功能，可以写成lambda表达式形式，简写为静态方法引用
 *
 * @author Dong
 * @version 1.0
 * @date 2021-04-15 18:00
 */

public class T01_StaticMethodRef {

    static void print() {
        System.out.println("a");
    }

    public static void main(String[] args) {

        ConstrutorFunction<String, Integer, Integer, Cv> construtorFunction = Cv::new;
        Cv asamiyui = construtorFunction.getInstance("asamiyui", 18, 10);


        // Role的构造方法引用
        BiFunction<String, Cv, Role> roleBiFunction = Role::new;
        Role role = roleBiFunction.apply("saiyuki", asamiyui);

        // 无参数、无返回值 (jdk中好像没有提供，自己造了个接口)
        // consumer.accept必须要接受一个泛型类型的参数
        Consumer<Cv> cvConsumer = Cv::fun;
        cvConsumer.accept(null);
        MethodWithoutArgsReturnFunction staticAct = Cv::staticAct;
        MethodWithoutArgsReturnFunction staticActLambda =() ->  Cv.staticAct();
        staticAct.invoke();

        // 无参数，有返回值
        Supplier<Integer> ageSupplier = Cv::staticAge;
        System.out.println(ageSupplier.get());

        /*有参数 无返回值*/
        Consumer<Role> roleConsumer = Cv::actRole;
        roleConsumer.accept(role);

        // 有参数 有返回值
        Function<Role,String> cvBifunction = Cv::actWithRole;
        System.out.println(cvBifunction.apply(role));

    }

}
